let hijackConfig = {
    //需要被挂载的方法
    methods: null,
    //对生命周期的改写，都在原周期前执行
    lifeCycle: null,
    //重写option
    rewrite: null
}

/**
 * 定义页面拦截器
 * @param {*} options 
 * 
 * 1）增加一个config关键字，放在data之前
 * 
 * 2）增加了一个生命周期 beforeLoad
 */

function hijackPage(options = {}) {

    (!options.config) && (options.config = {});

    //对options进行重写
    if (hijackConfig.rewrite) {
        const rewriteOptions = hijackConfig.rewrite(options);
        rewriteOptions && (options = rewriteOptions);
    }

    /**
     * 生命周期
     * 
     * onLoad 需要特殊处理
     */

    if (hijackConfig.lifeCycle && Object.prototype.toString.call(hijackConfig.lifeCycle) === '[object Object]') {
        for (const key in hijackConfig.lifeCycle) {
            let _lifeCycle = options[key];
            options[key] = function (opt = {}) {
                //增加一个页面周期
                (key === "onLoad" && options.beforeLoad) && options.beforeLoad(opt);
                //执行
                hijackConfig.lifeCycle[key].apply(this, [opt]);
                //执行页面onLoad，利用apply()挂载到页面this,并接受数组中的参数
                _lifeCycle && _lifeCycle.apply(this, [opt]);
            }
        }
    }


    //挂载方法到page
    if (hijackConfig.methods && Object.prototype.toString.call(hijackConfig.methods) === '[object Object]') {
        for (const key in hijackConfig.methods) {
            if (!options[key]) {
                options[key] = hijackConfig.methods[key];
            }
        }
    }

    //开始执行页面
    Page && Page(options);
}

function hijackPageConfig(config = {}) {
    hijackConfig = {
        ...hijackConfig,
        ...config
    }
}

export default {
    hijackPage,
    hijackPageConfig
}
